#include <mqueue.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
/* 模拟消息队列 */

static char *mq_name = "/mq_test"; // 队列文件的路径， /代表队列文件所在的目录 /dev/mqueue
static mqd_t mq;                   // 定义消息队列标识符

void *thread_fun_1(void *arg)
{
    char *msg = "你好张扬";
    printf("线程1开始执行,发送消息\n");
    mq_send(mq, msg, strlen(msg) + 1, 0);
}

void *thread_fun_2(void *arg)
{
    printf("线程2开始执行,接收消息\n");
    char msg[1024];
    ssize_t bytes = mq_receive(mq, msg, sizeof(msg), NULL);
    if (bytes == -1)
    {
        perror("线程2接收消息失败");
    }
    else
    {
        printf("线程2接收消息: %s\n", msg);
    }
}

int main(int argc, char const *argv[])
{

    printf("main线程开始执行 \n");
    // 1.创建消息队列
    struct mq_attr attr;
    attr.mq_maxmsg = 10;    // 最大消息数量
    attr.mq_msgsize = 1024; // 最大消息大小
    mq = mq_open(mq_name, O_RDWR | O_CREAT, 0644, &attr);
    if (mq == -1)
    {
        printf("队列创建或打开失败\n");
        return -1;
    }

    // 2.创建线程
    pthread_t ptr1, ptr2;
    pthread_create(&ptr1, NULL, thread_fun_1, NULL);
    pthread_create(&ptr2, NULL, thread_fun_2, NULL);

    // 3.等带线程结束
    pthread_join(ptr1, NULL);
    pthread_join(ptr2, NULL);

    // 4.关闭消息队列
    mq_close(mq);

    // 5.删除消息队列
    if (mq_unlink(mq_name) == -1)
    {
        printf("队列删除失败\n");
        return -1;
    }
    return 0;
}
